package com.llt.blog.utils;

import com.llt.blog.constants.Constant;
import io.jsonwebtoken.*;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.io.Encoders;
import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j;

import javax.crypto.SecretKey;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class JwtUtils {
    // 设置过期时间
    private final static long EXPIRATION_DATE = 60 * 60 * 1000;

    private final static String secretString = "HtURQpQQChb5XQwBWKduz3+dPP559qJxLwW00l1VFNc=";

    private final static Key key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secretString));

    // 生成令牌
    public static String genToken(Map<String, Object> claim) {
        return  Jwts.builder()
                .setClaims(claim)
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_DATE))
                .signWith(key)
                .compact();
    }

    // 解析令牌
    public static Claims parseToken(String token) {

        JwtParser build = Jwts.parserBuilder().setSigningKey(key).build();

        Claims body = null;

        try {
            body = build.parseClaimsJws(token).getBody();
        }  catch (ExpiredJwtException e) {
            log.error("token过期, token : ", token);
        }  catch (Exception e) {
        }

        return body;
    }

    // 校验令牌
    public static boolean checkToken(String token) {

        Claims body = parseToken(token);
        if (body == null) {
            return false;
        }

        return true;
    }

    public static Integer getUserIdFromToken(String token) {

        Claims body = parseToken(token);
        if (body != null) {
            return (Integer) body.get(Constant.USER_CLAIM_ID);
        }

        return null;
    }


}
